﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using l1cs.server.model.skill;
using MySql.Data.MySqlClient;
using l1cs.server.model.Instance;

namespace l1cs.server.datatables
{
    public class CharBuffTable
    {
        private CharBuffTable() { }

        private static Logger _log = Logger.getLogger( typeof( CharBuffTable ).FullName );

        private static int[] buffSkill = { 
            2, 67, // ライト、シェイプチェンジ
			3, 99, 151, 159, 168, // シールド、シャドウアーマー、アーススキン、アースブレス、アイアンスキン
			43, 54, 1000, 1001, L1SkillId.STATUS_ELFBRAVE, // ヘイスト、グレーターヘイスト、ブレイブポーション、グリーンポーション、エルヴンワッフル
			52, 101, 150, // ホーリーウォーク、ムービングアクセレーション、ウィンドウォーク
			26, 42, 109, 110, // PE:DEX、PE:STR、ドレスマイティー、ドレスデクスタリティー
			114, 115, 117, // グローウィングオーラ、シャイニングオーラ、ブレイブオーラ
			148, 155, 163, // ファイアーウェポン、ファイアーブレス、バーニングウェポン
			149, 156, 166, // ウィンドショット、ストームアイ、ストームショット
			1002, 1005, // ブルーポーション、チャット禁止
			L1SkillId.COOKING_1_0_N, L1SkillId.COOKING_1_0_S, L1SkillId.COOKING_1_1_N,
            L1SkillId.COOKING_1_1_S, // 料理(デザートは除く)                    
			L1SkillId.COOKING_1_2_N, L1SkillId.COOKING_1_2_S, L1SkillId.COOKING_1_3_N, L1SkillId.COOKING_1_3_S,
			L1SkillId.COOKING_1_4_N, L1SkillId.COOKING_1_4_S, L1SkillId.COOKING_1_5_N, L1SkillId.COOKING_1_5_S,
			L1SkillId.COOKING_1_6_N, L1SkillId.COOKING_1_6_S, L1SkillId.COOKING_2_0_N, L1SkillId.COOKING_2_0_S,
			L1SkillId.COOKING_2_1_N, L1SkillId.COOKING_2_1_S, L1SkillId.COOKING_2_2_N, L1SkillId.COOKING_2_2_S,
			L1SkillId.COOKING_2_3_N, L1SkillId.COOKING_2_3_S, L1SkillId.COOKING_2_4_N, L1SkillId.COOKING_2_4_S,
			L1SkillId.COOKING_2_5_N, L1SkillId.COOKING_2_5_S, L1SkillId.COOKING_2_6_N, L1SkillId.COOKING_2_6_S,
			L1SkillId.COOKING_3_0_N, L1SkillId.COOKING_3_0_S, L1SkillId.COOKING_3_1_N, L1SkillId.COOKING_3_1_S,
			L1SkillId.COOKING_3_2_N, L1SkillId.COOKING_3_2_S, L1SkillId.COOKING_3_3_N, L1SkillId.COOKING_3_3_S,
			L1SkillId.COOKING_3_4_N, L1SkillId.COOKING_3_4_S, L1SkillId.COOKING_3_5_N, L1SkillId.COOKING_3_5_S,
			L1SkillId.COOKING_3_6_N, L1SkillId.COOKING_3_6_S };

        /// <summary>
        /// プレイヤーのバフをDBから削除する。
        /// </summary>
        /// <param name="pc">プレイヤー</param>
        public static void DeleteBuff( L1PcInstance pc )
        {/*TTOK*/
            String sqlstr = "DELETE FROM character_buff WHERE char_obj_id=?1";
            using ( MySqlWrapper wrapper = new MySqlWrapper() )
            {
                MySqlCommand cmd = new MySqlCommand( sqlstr );
                cmd.Parameters.Add( "?1", MySqlDbType.Int32 ).Value = pc.getId();
                wrapper.ExecNonQuery( cmd );
            }
        }

        /// <summary>
        /// プレイヤーの有効なバフ探してDBに保存する。
        /// </summary>
        /// <param name="pc">プレイヤー</param>
        public static void SaveBuff( L1PcInstance pc )
        {/*TTOK*/
            foreach ( int skillId in buffSkill )
            {
                int timeSec = pc.getSkillEffectTimeSec( skillId );
                if ( 0 < timeSec )
                {
                    int polyId = 0;
                    if ( skillId == L1SkillId.SHAPE_CHANGE )
                    {
                        polyId = pc.getTempCharGfx();
                    }
                    StoreBuff( pc.getId(), skillId, timeSec, polyId );
                }
            }
        }

        /// <summary>
        /// プレイヤーのバフをDBに保存する。
        /// </summary>
        /// <param name="objId"></param>
        /// <param name="skillId"></param>
        /// <param name="time"></param>
        /// <param name="polyId"></param>
        private static void StoreBuff( int objId, int skillId, int time, int polyId )
        {/*TTOK*/
            String sqlstr = @"INSERT INTO character_buff SET 
                                char_obj_id    = ?1, 
                                skill_id       = ?2, 
                                remaining_time = ?3, 
                                poly_id        = ?4";
            using ( MySqlWrapper wrapper = new MySqlWrapper() )
            {
                MySqlCommand cmd = new MySqlCommand( sqlstr );
                cmd.Parameters.Add( "?1", MySqlDbType.Int32 ).Value = objId;
                cmd.Parameters.Add( "?2", MySqlDbType.Int32 ).Value = skillId;
                cmd.Parameters.Add( "?3", MySqlDbType.Int32 ).Value = time;
                cmd.Parameters.Add( "?4", MySqlDbType.Int32 ).Value = polyId;
                wrapper.ExecNonQuery( cmd );
            }
        }
    }
}
